package manejadores;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import censo.db;
import entidades.Perfiles;
import entidades.Usuario;

public class ManejadorUsuario {

	private db conexion = null;
	private Usuario user;
	
	public static final int ORDER_CODIGO = 1;
	public static final int ORDER_NOMBRE = 2;
	public static final int ORDER_PERFIL = 3;

	public ManejadorUsuario(db conexion) {
		super();
		this.conexion = conexion;
		this.user = new Usuario();
	}
	public ManejadorUsuario(db conexion, Usuario user) {
		super();
		this.conexion = conexion;
		this.user = user;
	}
	public db getConexion() {
		return conexion;
	}
	public void setConexion(db conexion) {
		this.conexion = conexion;
	}
	public Usuario getUser() {
		return user;
	}
	public void setUser(Usuario user) {
		this.user = user;
	}

	public boolean add() throws SQLException{
		boolean result = false;

			String sql = "insert into usuarios (usuario,nombre,perfil,clave,estado) values (?,?,?,password(?),?)";
			java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
			pst.setString(1, user.getCodigo());
			pst.setString(2, user.getNombre());
			pst.setString(3, user.getPerfil());
			pst.setString(4, user.getClave());
			pst.setString(5, user.getEstado());
			if (conexion.Update(pst) > 0) {
				conexion.Commit();
				result = true;
			}
			
		
		return result;
	}
	
	public boolean update(String key) throws SQLException{
		boolean result = false;

			String sql = "update usuarios set usuario= ?, nombre=?,perfil=?,estado=? where usuario=?";
			
			java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
			pst.setString(1, user.getCodigo());
			pst.setString(2, user.getNombre());
			pst.setString(3, user.getPerfil());
			pst.setString(4, user.getEstado());
			pst.setString(5, key);
			
			if (conexion.Update(pst) > 0) {
				conexion.Commit();
				result = true;
			}
			
		return result;
	}
	public boolean remove(String key) throws SQLException {
		boolean result = false;

			String sql = "delete from usuarios where usuario=?";
			java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
			pst.setString(1,key);
			if (conexion.Update(pst) > 0) {
				conexion.Commit();
				result = true;
			}
			

		return result;	
	}
	
	
	public boolean exist(String key) throws SQLException {
		boolean result = false;

			String sql = "select usuario from usuarios where usuario = ?";
			java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
			pst.setString(1,key);
			ResultSet rs = conexion.Query(pst);
			if (rs.next()) {
				result = true;
			}
			rs.close();
			
		
		return result;	
	}
	
	public boolean Find(String key) throws SQLException {
		boolean result = false;

			String sql = "select usuario, nombre, estado, clave, perfil from usuarios where usuario=?";
			java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
			pst.setString(1,key);
			ResultSet rs = conexion.Query(pst);
			if (rs.next()) {
				user = new Usuario();
				user.setCodigo(rs.getString("usuario"));
				user.setNombre(rs.getString("nombre"));
				user.setClave(rs.getString("clave"));
				user.setPerfil(rs.getString("perfil"));
				user.setEstado(rs.getString("estado"));
				result = true;
			}
			rs.close();
			
		return result;	
	}
	
	public ArrayList<Usuario> list() throws SQLException {
		ArrayList<Usuario> users = new ArrayList<Usuario>();
		
			String sql = "select usuario, nombre, estado, clave, perfil from usuarios order by usuario";
			ResultSet rs  = conexion.Query(sql);
			while(rs.next()) {
				Usuario u = new Usuario();
				u.setCodigo(rs.getString("usuario"));
				u.setNombre(rs.getString("nombre"));
				u.setPerfil(rs.getString("perfil"));
				u.setEstado(rs.getString("estado"));
				users.add(u);
			}
			rs.close();
		
		return users;
	}
	
	public ArrayList<Usuario> list(int orden) throws SQLException {
		ArrayList<Usuario> users = new ArrayList<Usuario>();

			String sql = "select usuario, nombre, estado, clave, perfil from usuarios ";
			
			switch(orden) {
			case ORDER_CODIGO:
				sql += " order by usuario";
			break;
			case ORDER_NOMBRE:
				sql += " order by nombre";
			break;
			case ORDER_PERFIL:
				sql += " order by perfil";
			break;
			}
			ResultSet rs  = conexion.Query(sql);
			while(rs.next()) {
				Usuario u = new Usuario();
				u.setCodigo(rs.getString("usuario"));
				u.setNombre(rs.getString("nombre"));
				u.setPerfil(rs.getString("perfil"));
				u.setEstado(rs.getString("estado"));
				users.add(u);
			}
			rs.close();
		
		return users;	
	}
	
	public boolean login(String usuario,String clave) throws SQLException {
		boolean ret = false;

			String sql = "select usuario,nombre,perfil,estado,clave from usuarios where usuario=? and clave=password(?) and estado=1";
			java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
			pst.setString(1,usuario);
			pst.setString(2,clave);
			ResultSet rs = conexion.Query(pst);
			if (rs.next()) {
				user = new Usuario();
				user.setCodigo(rs.getString("usuario"));
				user.setNombre(rs.getString("nombre"));
				user.setClave(rs.getString("clave"));
				user.setPerfil(rs.getString("perfil"));
				user.setEstado(rs.getString("estado"));
				ret = true;
			}
			

		
		return ret;
	}
	
	public ArrayList<Perfiles> perfiles() throws SQLException {
		ArrayList <Perfiles> p = new ArrayList<Perfiles>();
		String sql = "select * from perfiles order by perfil";
			ResultSet rs = conexion.Query(sql);
			while(rs.next()) {
				Perfiles a = new Perfiles();
				a.setId(rs.getString("id"));
				a.setPerfil(rs.getString("perfil"));
				p.add(a);
			}
		
		return p;
		
	
}
	public boolean changepassword(String usuario,String clave) throws SQLException {
		boolean ret = false;

			String sql = "update usuarios set clave=password(?) where usuario=?";
			java.sql.PreparedStatement pst = conexion.getConnection().prepareStatement(sql);
			pst.setString(1,clave);
			pst.setString(2,usuario);
			if (conexion.Update(pst)>0) {
				conexion.Commit();
				ret = true;
			}
		
		
		return ret;
	}
}